﻿#define  _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//int i; 
//void prt() 
//{ 
//	for (i = 5; i < 8; i++)
//		printf("%c", '*');
//	printf("\t"); 
//}
//int main() 
//{
//	for (i = 5; i <= 8; i++)
//		prt();
//	return 0;
//}

//#include <stdio.h>
//int main() {
//	int a = 3;
//	printf("%d\n", (a += a -= a * a));
//	return 0;
//}

//描述
//首先输入要输入的整数个数n，然后输入n个整数。输出为n个整数中负数的个数，和所有正整数的平均值，结果保留一位小数。
//0即不是正整数，也不是负数，不计入计算。如果没有正数，则平均值为0。
//数据范围： 1 \le n\ \le 2000 \1≤n ≤2000  ，输入的整数都满足 | val | \le 1000 \∣val∣≤1000
//输入描述：
//首先输入一个正整数n，
//然后输入n个整数。
//输出描述：
//输出负数的个数，和所有正整数的平均值。
//#include <stdio.h>
//int main()
//{
//    int n = 0;
//    scanf("%d", &n);
//    int i = 0;
//    int k = 0;
//    int num = 0;
//    double add = 0;
//    int n2 = 0;
//    for (i = 0; i < n; i++)
//    {
//        scanf("%d", &k);
//        if (k > 0)
//        {
//            add += k;
//            n2++;
//        }
//        else if (k < 0)
//            num++;
//    }
//    double average = 0;
//    if (0 == n2)
//    {
//        printf("%d %.1lf", num, average);
//    }
//    else
//    {
//        average = add / n2;
//        printf("%d %.1lf", num, average);
//    }
//    return 0;
//}

//描述
//有一个长度为 n 的非降序数组，比如[1, 2, 3, 4, 5]，将它进行旋转，
//即把一个数组最开始的若干个元素搬到数组的末尾，变成一个旋转数组，
//比如变成了[3, 4, 5, 1, 2]，或者[4, 5, 1, 2, 3]这样的。请问，给定这样一个旋转数组，
//求数组中的最小值。
//数据范围：1 \le n \le 100001≤n≤10000，数组中任意元素的值: 0 \le val \le 100000≤val≤10000
//要求：空间复杂度：O(1)O(1) ，时间复杂度：O(logn)O(logn)
/**
 *
 * @param rotateArray int整型一维数组
 * @param rotateArrayLen int rotateArray数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static，防止重复定义
 */
 //https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=23269&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
//static min;
//int minNumberInRotateArray(int* rotateArray, int rotateArrayLen) {
//    // write code here
//    int i = 0;
//    min = rotateArray[0];
//    for (i = 1; i < rotateArrayLen; i++)
//    {
//        if (rotateArray[i] < min)
//            min = rotateArray[i];
//    }
//    return min;
//}

//#include <stdio.h>
//int main()
//{
//	int m, n;
//	printf("Enter m,n;");
//	scanf("%d%d", &m, &n);
//	while (m != n) //1
//	{
//		while(m>n) m=m-n;//2
//		while(n>m) n=n-m; //3
//	}
//	printf("m=%d\n", m);
//	return 0;
//}

//#include <stdio.h>
//int main()
// {
//	char c; int v0 = 0, v1 = 0, v2 = 0;
//	do
//	{
//		switch (c = getchar())
//		{
//			case'a':case'A':
//			case'e':case'E':
//			case'i':case'I':
//			case'o':case'O':
//			case'u':case'U':
//				v1 += 1;
//			default :
//				v0 += 1;v2 += 1;
//		}
//	} while (c != '\n');
//	printf("v0=%d,v1=%d,v2=%d\n", v0, v1, v2);
//	return 0;
// }

//#include <stdio.h>
//int main()
//{
//	int a[] = { 4, 0, 2, 3, 1 }, i, j, t;
//	for (i = 1; i < 5; i++)
//	{
//		t = a[i];
//		j = i - 1;
//		while (j >= 0 && t < a[j])
//		{
//			a[j + 1] = a[j];
//			--j;
//		}
//		a[j + 1] = t;
//	}
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", a[i]);
//	}
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int i = 0, j = 0;
//	int state = 0;
//	int n = 5;
//	for (i = 0; i <= n - 1; i++) // (1)
//		for(j = n; j > i; j--) // (2)
//			state++; // (3)
//	printf("%d\n", state);
//	return 0;
//}

//集合 s 包含从 1 到 n 的整数。不幸的是，因为数据错误，导致集合里面某一个数字复制了成了集合里面的另外一个数字的值，
//导致集合 丢失了一个数字 并且 有一个数字重复 。
//给定一个数组 nums 代表了集合 S 发生错误后的结果。
//请你找出重复出现的整数，再找到丢失的整数，将它们以数组的形式返回。
//来源：力扣（LeetCode）
//链接：https ://leetcode.cn/problems/set-mismatch
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
//int cmp(const void* e1, const void* e2)
//{
//    return *(int*)e1 - *(int*)e2;
//}
//int* findErrorNums(int* nums, int numsSize, int* returnSize) {
//    static int errornums[2] = { 0 };
//    *returnSize = 2;
//    int repeat = 0;
//    int lost = 0;
//    qsort(nums, numsSize, sizeof(nums[0]), cmp);
//    if (nums[0] != 1) {
//        lost = 1;
//    }
//    int i = 0;
//    for (i = 0; i < numsSize - 1; i++)
//    {
//        if (nums[i] == nums[i + 1]) {
//            repeat = nums[i];
//        }
//        if (nums[i + 1] - nums[i] == 2) {
//            lost = nums[i] + 1;
//        }
//    }
//    if (nums[numsSize - 1] != numsSize) {
//        lost = numsSize;
//    }
//    errornums[0] = repeat;
//    errornums[1] = lost;
//    return errornums;
//}

//描述
//小明同学最近开发了一个网站，在用户注册账户的时候，需要设置账户的密码，为了加强账户的安全性，小明对密码强度有一定要求：
//1. 密码只能由大写字母，小写字母，数字构成；
//2. 密码不能以数字开头；
//3. 密码中至少出现大写字母，小写字母和数字这三种字符类型中的两种；
//4. 密码长度至少为8
//现在小明受到了n个密码，他想请你写程序判断这些密码中哪些是合适的，哪些是不合法的。
//输入描述：
//输入一个数n，接下来有n(n≤100)行，每行一个字符串，表示一个密码，输入保证字符串中只出现大写字母，小写字母和数字，字符串长度不超过100。
//输出描述：
//输入n行，如果密码合法，输出YES，不合法输出NO
#include <stdio.h>
#include <string.h>
int is_leg(char str[])
{
    int len = strlen(str);

    if (len <= 100 && len >= 8)
    {
        int num = 0, Ch = 0, ch = 0;
        if (*str >= 48 && *str <= 57)
            return 0;
        while (str)
        {
            if (*str >= 48 && *str <= 57)
                num++;
            else if (*str >= 65 && *str <= 90)
                Ch++;
            else if (*str >= 97 && *str <= 122)
                ch++;
            else if (*str == '\0')
                break;
            else
                return 0;
            str++;
        }
        if ((num > 0) + (Ch > 0) + (ch > 0) > 1)
            return 1;
        else
            return 0;
    }
    else
        return 0;
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    char str[101] = { 0 };
    while (n--)
    {
        scanf("%s", &str);
        int is = is_leg(str);
        if (0 == is)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}